"use strict";
const path = require("path");
const defaultSettings = require("./src/settings.js");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
// 引入happypack
const Happypack = require('happypack');

function resolve(dir) {
  return path.join(__dirname, dir);
}

function exec(cmd) {
  return require("child_process")
    .execSync(cmd)
    .toString()
    .trim();
}

const name = defaultSettings.title || "iot"; // page title

// If your port is set to 80,
// use administrator privileges to execute the command line.
// For example, Mac: sudo npm run
// You can change the port by the following methods:
// port = 9528 npm run dev OR npm run dev --port = 9528
const port = process.env.port || process.env.npm_config_port || 9528; // dev port

// All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = {
  /**
   * You will need to set publicPath if you plan to deploy your site under a sub path,
   * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
   * then publicPath should be set to "/bar/".
   * In most cases please use '/' !!!
   * Detail: https://cli.vuejs.org/config/#publicpath
   */
  publicPath: "/",
  outputDir: "dist",
  assetsDir: "static",
  lintOnSave: process.env.NODE_ENV === "development",
  productionSourceMap: false,
  lintOnSave: false,
  devServer: {
    port: port,
    // open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    proxy: {
      // change xxx-api/login => mock/login
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      "/minyong": {
        // target: `http://118.31.64.25:51906/`,
        // target: `http://124.70.158.145:58686/`,
        target: `http://118.31.64.25:51912/`,
        // target: `http://172.16.0.108:8222/`,
        changeOrigin: true
      },
      "/auth": {
        // target: `http://118.31.64.25:51906/`,
        // target: `http://124.70.158.145:58686/`,
        target: `http://118.31.64.25:51910/`,
        // target: `http://172.16.0.108:8000/`,
        changeOrigin: true
      },
      "/gongye": {
        // target: `http://118.31.64.25:51906/`,
        // target: `http://124.70.158.145:58686/`,
        target: `http://118.31.64.25:51911/`,
        // target: `http://172.16.0.108:8000/`,
        changeOrigin: true
      },

      "/daping": {
        target: `http://118.31.64.25:51925/`,
        // target: `http://124.70.158.145:58686/`,
        // target: `http://172.28.254.220:8111/`,
        // target: `http://172.16.0.108:8000/`,
        changeOrigin: true
      },

      "/shujuyuanediter/": {
        target: `http://118.31.64.25:51925/`,
        // target: `http://124.70.158.145:58686/`,
        // target: `http://172.28.254.220:8111/`,
        // target: `http://172.16.0.108:8000/`,
        changeOrigin: true
      },

      "/resource": {
        target: `http://118.31.64.25:51960/`,
        // target: `http://124.70.158.145:58686/`,
        // target: `http://172.28.254.220:8111/`,
        // target: `http://172.16.0.108:8000/`,
        pathRewrite: {     // pathRewrite表示路径重写，key表示一个正则，value表示别名 
          '^/resource': '/'   // 即用 '/api'表示'http://localhost:3000/api'
        },
        changeOrigin: true
      }
    }
  },
  // module: {
  //   rules: [
  //     {
  //       test: /\.worker\.js$/,
  //       use: {
  //         loader: "worker-loader",
  //         options: { inline: true, name: "workerName.[hash].js" }
  //       }
  //     }
  //   ]
  // },
  configureWebpack: config => {
    if (process.env.NODE_ENV !== "production") {
      // 开发环境配置
      config.devtool = "source-map";
      // exec("/d/zxn/frp/frpc -c /d/zxn/frp/frpc.ini")
      // exec("nohup sh ./build/proxy.sh")
    }

    // config.module.rules.push({
    //   test: /\.worker\.js$/,
    //   use: {
    //     loader: "worker-loader",
    //     // options: { inline: true, name: "workerName.[hash].js" }
    //   }
    // });

    return {
      // ...config,
      // provide the app's title in webpack's name field, so that
      // it can be accessed in index.html to inject the correct title.
      name: name,
      resolve: {
        alias: {
          "@": resolve("src")
        }
      },
      externals: {
        AMap: "AMap"
      },
      plugins: [
        // new Happypack({
        //   loaders: ['babel-loader', 'vue-loader', 'url-loader'],
        //   // cache: true,
        //   threads: 6 // 线程数取决于你电脑性能的好坏，好的电脑建议开更多线程
        // }),
        new MonacoWebpackPlugin(),
        new CopyWebpackPlugin([
          {
            from: "./node_modules/cesium/Build/Cesium", // 调试时，将Cesium换成CesiumUnminified
            to: "js/Cesium",
            toType: "dir"
          },
          {
            from: "./node_modules/earthsdk/dist/XbsjCesium",
            to: "js/earthsdk/XbsjCesium",
            toType: "dir"
          },
          {
            from: "./node_modules/earthsdk/dist/XbsjEarth",
            to: "js/earthsdk/XbsjEarth",
            toType: "dir"
          },
          {
            from: "./node_modules/zxn-ui/XbsjEarthUI",
            to: "js/earthsdk/XbsjEarthUI",
            toType: "dir"
          },
          {
            from: "./node_modules/zxn-ui/XbsjEarth-Plugins",
            to: "js/earthsdk/XbsjEarth-Plugins",
            toType: "dir"
          },
          {
            from: "./node_modules/zxn-ui/Apps/Demos/Viewer/scripts",
            to: "js/earthsdk/scripts",
            toType: "dir"
          }
        ])
      ]
    };
  },

  chainWebpack(config) {
    config.plugins.delete("preload"); // TODO: need test
    config.plugins.delete("prefetch"); // TODO: need test

    // set svg-sprite-loader
    config.module
      .rule("svg")
      .exclude.add(resolve("src/icons"))
      .end();
    config.module
      .rule("icons")
      .test(/\.svg$/)
      .include.add(resolve("src/icons"))
      .end()
      .use("svg-sprite-loader")
      .loader("svg-sprite-loader")
      .options({
        symbolId: "icon-[name]"
      })
      .end();

    // set preserveWhitespace
    config.module
      .rule("vue")
      .use("vue-loader")
      .loader("vue-loader")
      .tap(options => {
        options.compilerOptions.preserveWhitespace = true;
        return options;
      })
      .end();

    // set preserveWhitespace
    // config.module
    //   .rule("/.worker.js$/")
    //   .use("worker-loader")
    //   .loader("worker-loader")
    //   .tap(options => {
    //     options.inline = true;
    //     options.name = "workerName.[hash].js";
    //   })
    //   .end();

    config
      // https://webpack.js.org/configuration/devtool/#development
      .when(process.env.NODE_ENV === "development", config =>
        config.devtool("cheap-source-map")
      );

    config.when(process.env.NODE_ENV !== "development", config => {
      config
        .plugin("ScriptExtHtmlWebpackPlugin")
        .after("html")
        .use("script-ext-html-webpack-plugin", [
          {
            // `runtime` must same as runtimeChunk name. default is `runtime`
            inline: /runtime\..*\.js$/
          }
        ])
        .end();
      config.optimization.splitChunks({
        chunks: "all",
        cacheGroups: {
          libs: {
            name: "chunk-libs",
            test: /[\\/]node_modules[\\/]/,
            priority: 10,
            chunks: "initial" // only package third parties that are initially dependent
          },
          elementUI: {
            name: "chunk-elementUI", // split elementUI into a single package
            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
            test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
          },
          commons: {
            name: "chunk-commons",
            test: resolve("src/components"), // can customize your rules
            minChunks: 3, //  minimum common number
            priority: 5,
            reuseExistingChunk: true
          }
        }
      });
      config.optimization.runtimeChunk("single");
    });
  }
};
